package com.study.templatemethod;


/**
 * 模板方法模式
 *
 * 源码中的发现
 * 我们以前的servlet开发那种就用到了模板方法模式 get / post请求 都会先经过service 然后经service判断是get请求就走doGet 是post请求就走doPost
 * 然后模板就会调用到我们自己实现的doGet / doPost方法中
 *
 * 我们的controller层也是如此 只是我们一般使用注解的方式做了
 *
 */
public class TemplateMethodTest {
    public static void main(String[] args) {

        TemplateMethod templateMethod = new TemplateMethodImpl1();
        templateMethod.operation();

    }
}



abstract class TemplateMethod{

    public void operation(){
        System.out.println("pre1 ...");
        System.out.println("pre2 ...");
        System.out.println("pre3 ...");

        //调用具体实现类的method1()方法,这样所有的实现都能在调用目标方法前跟后做一些别的事情
        //比如我们可以自己写一个LockUtil 在目标方法前后上锁跟解锁 这样就能避免在代码中万一忘记解锁导致死锁问题 且 可以节省掉代码中每次自己写try final代码块
        method1();

        System.out.println("post1 ...");
        System.out.println("post2 ...");
        System.out.println("post3 ...");

    }

    //钩子方法
    abstract void method1();


}


class TemplateMethodImpl1 extends  TemplateMethod{

    @Override
    void method1() {
        System.out.println("我是具体的目标业务方法");
    }
}




